From ed7b1adc5e05f8d8b2211826a3085d052f639534 Mon Sep 17 00:00:00 2001 From: Jonathan Dieter Date: Sat, 21 Apr 2018 14:25:52 +0300 Subject: [PATCH] Add first test Signed-off-by: Jonathan Dieter --- test/empty.c | 94 ++++++++++++++++++++++++++++++++++++++++++++ test/lib/meson.build | 2 + test/lib/util.c | 45 +++++++++++++++++++++ test/lib/util.h | 29 ++++++++++++++ test/meson.build | 7 ++++ 5 files changed, 177 insertions(+) create mode 100644 test/empty.c create mode 100644 test/lib/meson.build create mode 100644 test/lib/util.c create mode 100644 test/lib/util.h diff --git a/test/empty.c b/test/empty.c new file mode 100644 index 0000000..1c6fca6 --- /dev/null +++ b/test/empty.c @@ -0,0 +1,94 @@ +/* + * Copyright 2018 Jonathan Dieter + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "zck_private.h" +#include "util.h" + +static char *checksum="42590fea6f55aca71e222ebe2d147ed89d17aac951a997fef8b980b2803a0412"; + +int main (int argc, char *argv[]) { + int out = open("empty.zck", O_WRONLY | O_CREAT | O_TRUNC, 0666); + if(out < 0) { + perror("Unable to open empty.zck for writing"); + exit(1); + } + zckCtx *zck = zck_init_write(out); + if(zck == NULL) + exit(1); + + if(!zck_close(zck)) + exit(1); + close(out); + zck_free(&zck); + int in = open("empty.zck", O_RDONLY); + if(in < 0) { + perror("Unable to open empty.zck for reading"); + exit(1); + } + /* File should be 101 bytes, but we'll go a bit over */ + char *data = zmalloc(1000); + if(data == NULL) { + perror("Unable to allocate 1000 bytes"); + exit(1); + } + ssize_t len = read(in, data, 1000); + if(len < 0) { + perror("Unable to read from empty.zck"); + exit(1); + } + char *cksum = get_hash(data, len, ZCK_HASH_SHA256); + printf("empty.zck: (SHA-256)%s\n", cksum); + if(memcmp(cksum, checksum, strlen(cksum)) != 0) { + printf("Expected checksum: (SHA-256)%s\n", checksum); + exit(1); + } + if(lseek(in, 0, SEEK_SET) != 0) { + perror("Unable to seek to beginning of empty.zck"); + exit(1); + } + zck = zck_init_read(in); + if(zck == NULL) + exit(1); + memset(data, 0, 1000); + len = zck_read(zck, data, 1000); + if(len > 0) { + printf("%li bytes read, but file should be empty\n", len); + exit(1); + } + if(!zck_close(zck)) + exit(1); + + return 0; +} diff --git a/test/lib/meson.build b/test/lib/meson.build new file mode 100644 index 0000000..96976c5 --- /dev/null +++ b/test/lib/meson.build @@ -0,0 +1,2 @@ +util_sources += lib_sources +util_sources += files('util.c') diff --git a/test/lib/util.c b/test/lib/util.c new file mode 100644 index 0000000..734cbd0 --- /dev/null +++ b/test/lib/util.c @@ -0,0 +1,45 @@ +/* + * Copyright 2018 Jonathan Dieter + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include "../../src/lib/zck_private.h" + +char *get_hash(char *data, size_t length, int type) { + zckHashType hash_type = {0}; + zckHash hash = {0}; + if(!zck_hash_setup(&hash_type, type)) + return NULL; + if(!zck_hash_init(&hash, &hash_type)) + return NULL; + if(!zck_hash_update(&hash, data, length)) + return NULL; + char *digest = zck_hash_finalize(&hash); + if(digest == NULL) + return NULL; + return get_digest_string(digest, hash_type.digest_size); +} + diff --git a/test/lib/util.h b/test/lib/util.h new file mode 100644 index 0000000..6e52574 --- /dev/null +++ b/test/lib/util.h @@ -0,0 +1,29 @@ +/* + * Copyright 2018 Jonathan Dieter + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +char *get_hash(char *data, size_t length, int type) + __attribute__ ((warn_unused_result)); + diff --git a/test/meson.build b/test/meson.build index e69de29..c49ad0f 100644 --- a/test/meson.build +++ b/test/meson.build @@ -0,0 +1,7 @@ +util_sources = [] +subdir('lib') +incdir = include_directories(['lib', '../src/lib', '../include']) +empty = executable('empty', ['empty.c'] + util_sources, include_directories: incdir, dependencies: [zstd_dep, curl_dep]) +file_path = join_paths(meson.source_root(), 'test/files') + +test('create and validate empty zchunk file', empty) -- 2.30.2